
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.Common;
using Gman.Entity.Entities;
using Gman.Entity.Interfaces;
using Gman.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;

namespace Gman.Data
{
  //-------------------------------------------------------------------
  //Archivo     : ServicioDA.cs
  //Proyecto    : Gman
  //Creacion    : BIS(NombreDesarrollador) 20130226
  //Modificacion: 
  //Descripcion : Clase para capa de datos.
  //-------------------------------------------------------------------
  public class ServicioDA : IServicio
  {

  Database db = DatabaseFactory.CreateDatabase();

  //-----------------------------------------------------------------------------------------------
  //Nombre: Listar
  //Objetivo: Retorna una lista de registros de tipo ServicioBE  
  //Creacion    : TISI(NombreDesarrollador) 20130226  
  //-----------------------------------------------------------------------------------------------
  public IList<ServicioBE> Listar(ServicioBE oItem)
  {
    IList<ServicioBE> lista = new List<ServicioBE>();			
    try
    {				
      #region Creando consulta
        string query = "SELECT IDServicio,TipoServ,SistServ,CatServ,SubCatServ,DescServ,UniMedServ " +
                       "FROM Servicio WHERE ";

      if (oItem.IDEmp != null || oItem.IDEmp > 0) query += "IDEmp = " + oItem.IDEmp;
      if (oItem.TipoServ != null && !oItem.TipoServ.Equals("")) query += " AND  TipoServ = " + oItem.TipoServ;
      if (oItem.SistServ != null && !oItem.SistServ.Equals("")) query += " AND SistServ = " + oItem.SistServ;
      if (oItem.CatServ != null && !oItem.CatServ.Equals("")) query += " AND CatServ = " + oItem.CatServ;
      if (oItem.SubCatServ != null && !oItem.SubCatServ.Equals("")) query += " AND SubCatServ = " + oItem.SubCatServ;
      if (oItem.DescServ != null && !oItem.DescServ.Equals("")) query += " AND DescServ LIKE '%" + oItem.DescServ+"%'";

      #endregion

      DbCommand cmd = db.GetStoredProcCommand("SP_ListarServicio");
      db.AddInParameter(cmd, "@query", DbType.String, query);

      using (IDataReader oR = db.ExecuteReader(cmd))
      {
        lista = MakeUniqueDatosListado(oR);
      }
      
    }catch (Exception ex){
      throw new Exception("ServicioDA.Listar()", ex);
    }
    finally
    {
    }
    return lista;
  }

  //-----------------------------------------------------------------------------------------------
  //Nombre: Obtener
  //Objetivo: Retorna un objeto de Tipo ServicioBE  
  //Creacion    : BIS(NombreDesarrollador) 20130226  
  //-----------------------------------------------------------------------------------------------
  public ServicioBE Obtener(ServicioBE oItem)
  {
    ServicioBE itemResult = null;
    try
    {
      DbCommand cmd = db.GetStoredProcCommand("SP_ObtenerServicio");
      db.AddInParameter(cmd, "@IDServicio", DbType.Int64, oItem.IDServicio);

      using (IDataReader oR = db.ExecuteReader(cmd))
      {
        while (oR.Read())
        {
          itemResult = MakeDatosMapeados(oR);
        }
      }
      return itemResult;
    }
    catch (Exception ex)
    {
      throw new Exception("ServicioDA.Obtener()", ex);                  
    }
    finally
    {
    }
  }

  //-----------------------------------------------------------------------------------------------
  //Nombre: Registrar
  //Objetivo: Almacena el registro de un objeto de tipo ServicioBE  
  //Creacion    : TISI(NombreDesarrollador) 20130226  
  //----------------------------------------------------------------------------------------------
  public Int64 Registrar(ServicioBE oItem)
  { 
    Int64 resultado = 0;
    try
    {
      DbCommand cmd = db.GetStoredProcCommand("SP_RegistrarServicio");						
      //db.AddInParameter(cmd, "@IDServicio", DbType.Int64 , oItem.IDServicio);
      db.AddInParameter(cmd, "@SistServ", DbType.String, oItem.SistServ);
      db.AddInParameter(cmd, "@DescServ", DbType.String, oItem.DescServ);
      db.AddInParameter(cmd, "@TipoServ", DbType.String, oItem.TipoServ);
      db.AddInParameter(cmd, "@CatServ", DbType.String, oItem.CatServ);
      db.AddInParameter(cmd, "@SubCatServ", DbType.String, oItem.SubCatServ);
      db.AddInParameter(cmd, "@UniMedServ", DbType.String, oItem.UniMedServ);
      db.AddInParameter(cmd, "@TmpoAtencServ", DbType.Int32 , oItem.TmpoAtencServ);
      db.AddInParameter(cmd, "@PlazoMaxServ", DbType.Int32 , oItem.PlazoMaxServ);
      //db.AddInParameter(cmd, "@EstadoServ", DbType.Int32 , oItem.EstadoServ);
      db.AddInParameter(cmd, "@UsuReg", DbType.String, oItem.UsuReg);
      //db.AddInParameter(cmd, "@FecReg", DbType.DateTime, oItem.FecReg);
      db.AddInParameter(cmd, "@TermCnxReg", DbType.String, oItem.TermCnxReg);
      //db.AddInParameter(cmd, "@UsuMod", DbType.String, oItem.UsuMod);
      //db.AddInParameter(cmd, "@fecMod", DbType.DateTime, oItem.fecMod);
      //db.AddInParameter(cmd, "@TermCnxMod", DbType.String, oItem.TermCnxMod);
      db.AddInParameter(cmd, "@IDEmp", DbType.Int32 , oItem.IDEmp);
      db.AddInParameter(cmd, "@ImpServ", DbType.Decimal, oItem.ImpServ);
      
      resultado = Convert.ToInt64(db.ExecuteScalar(cmd));      

    }
    catch (Exception ex)
    {
      throw new Exception("ServicioDA.Registrar()", ex);
    }
    finally
    {

    }
    return resultado;
  }

  //-----------------------------------------------------------------------------------------------
  //Nombre: Actualizar
  //Objetivo: Actualiza el registro de un objeto de tipo ServicioBE 
  //Creacion    : TISI(NombreDesarrollador) 20130226  
  //-----------------------------------------------------------------------------------------------
  public int Actualizar(ServicioBE oItem)
  {
    int resultado = 0;
    try
    {
      DbCommand cmd = db.GetStoredProcCommand("SP_ActualizarServicio");						
      db.AddInParameter(cmd, "@IDServicio", DbType.Int64 , oItem.IDServicio);
      db.AddInParameter(cmd, "@SistServ", DbType.String, oItem.SistServ);
      db.AddInParameter(cmd, "@DescServ", DbType.String, oItem.DescServ);
      db.AddInParameter(cmd, "@TipoServ", DbType.String, oItem.TipoServ);
      db.AddInParameter(cmd, "@CatServ", DbType.String, oItem.CatServ);
      db.AddInParameter(cmd, "@SubCatServ", DbType.String, oItem.SubCatServ);
      db.AddInParameter(cmd, "@UniMedServ", DbType.String, oItem.UniMedServ);
      db.AddInParameter(cmd, "@TmpoAtencServ", DbType.Int32 , oItem.TmpoAtencServ);
      db.AddInParameter(cmd, "@PlazoMaxServ", DbType.Int32 , oItem.PlazoMaxServ);
      db.AddInParameter(cmd, "@EstadoServ", DbType.Int32 , oItem.EstadoServ);
      //db.AddInParameter(cmd, "@UsuReg", DbType.String, oItem.UsuReg);
      //db.AddInParameter(cmd, "@FecReg", DbType.DateTime, oItem.FecReg);
      //db.AddInParameter(cmd, "@TermCnxReg", DbType.String, oItem.TermCnxReg);
      db.AddInParameter(cmd, "@UsuMod", DbType.String, oItem.UsuMod);
      //db.AddInParameter(cmd, "@fecMod", DbType.DateTime, oItem.fecMod);
      db.AddInParameter(cmd, "@TermCnxMod", DbType.String, oItem.TermCnxMod);
      db.AddInParameter(cmd, "@IDEmp", DbType.Int32 , oItem.IDEmp);
      db.AddInParameter(cmd, "@ImpServ", DbType.Decimal, oItem.ImpServ);
      
      resultado = db.ExecuteNonQuery(cmd);

    }
    catch (Exception ex)
    {
      throw new Exception("ServicioDA.Actualizar()", ex);
    }
    finally
    {

    }
    return resultado;
  }

  //-----------------------------------------------------------------------------------------------
  //Nombre: Eliminar
  //Objetivo: Elimina el registro de un objeto de tipo ServicioBE  
  //Creacion    : BIS(NombreDesarrollador) 20130226  
  //-----------------------------------------------------------------------------------------------
  public int Eliminar(ServicioBE oItem)
  {
    int resultado = 0;
    try
    {
      DbCommand cmd = db.GetStoredProcCommand("SP_EliminarServicio");						
      db.AddInParameter(cmd, "@IDServicio", DbType.Int64 , oItem.IDServicio);
      

      resultado = db.ExecuteNonQuery(cmd);      

    }
    catch (Exception ex)
    {
      throw new Exception("ServicioDA.Eliminar()", ex);
  }
  finally
  {

  }
  return resultado;
  }  

  private IList<ServicioBE> MakeUniqueDatos(IDataReader oR)
  {
    IList<ServicioBE> list = new List<ServicioBE>();

    while (oR.Read())
      list.Add(MakeDatosMapeados(oR));

    return list;
  }

  private ServicioBE MakeDatosMapeados(IDataReader oR)
  {
    var itemResult = new ServicioBE();
    
      itemResult.IDServicio= oR["IDServicio"].ToInt64();
      itemResult.SistServ= oR["SistServ"].ToString();
      itemResult.DescServ= oR["DescServ"].ToString();
      itemResult.TipoServ= oR["TipoServ"].ToString();
      itemResult.CatServ= oR["CatServ"].ToString();
      itemResult.SubCatServ= oR["SubCatServ"].ToString();
      itemResult.UniMedServ= oR["UniMedServ"].ToString();
      itemResult.TmpoAtencServ= oR["TmpoAtencServ"].ToInt32();
      itemResult.PlazoMaxServ= oR["PlazoMaxServ"].ToInt32();
      itemResult.ImpServ = oR["ImpServ"].ToDecimal();
      itemResult.EstadoServ= oR["EstadoServ"].ToInt32();
      itemResult.UsuReg= oR["UsuReg"].ToString();
      itemResult.FecReg= oR["FecReg"].ToDateTime();
      itemResult.TermCnxReg= oR["TermCnxReg"].ToString();
      itemResult.UsuMod= oR["UsuMod"].ToString();
      itemResult.fecMod= oR["fecMod"].ToDateTime();
      itemResult.TermCnxMod= oR["TermCnxMod"].ToString();
      itemResult.IDEmp= oR["IDEmp"].ToInt32();
  
    return itemResult;
  }



  private IList<ServicioBE> MakeUniqueDatosListado(IDataReader oR)
  {
      IList<ServicioBE> list = new List<ServicioBE>();

      while (oR.Read())
          list.Add(MakeDatosMapeadosListados(oR));

      return list;
  }

  private ServicioBE MakeDatosMapeadosListados(IDataReader oR)
  {
      var itemResult = new ServicioBE();

      itemResult.IDServicio = oR["IDServicio"].ToInt64();
      itemResult.SistServ = oR["SistServ"].ToString();
      itemResult.DescServ = oR["DescServ"].ToString();
      itemResult.TipoServ = oR["TipoServ"].ToString();
      itemResult.CatServ = oR["CatServ"].ToString();
      itemResult.SubCatServ = oR["SubCatServ"].ToString();
      itemResult.UniMedServ = oR["UniMedServ"].ToString();
      //itemResult.TmpoAtencServ = oR["TmpoAtencServ"].ToInt32();
      //itemResult.PlazoMaxServ = oR["PlazoMaxServ"].ToInt32();
      return itemResult;
  }

  public IList<BienBE> ListarBienXServicio(ServicioBE oItem)
  {
      IList<BienBE> lista = new List<BienBE>();
      try
      {
          ServicioBienDA oServicioBienDA = new ServicioBienDA();
          lista = oServicioBienDA.ListarBienesXServicio(oItem);
      }
      catch (Exception ex)
      {
          throw new Exception("ServicioDA.ListarProveedoresXServicio()", ex);
      }
      finally
      {
      }
      return lista;
  }


 }
}
